import type { ItemRarity } from '../../data/item/type';
import { type BattleSkill } from '../battle-skill';
import type { BattleSide, BattleUnit } from './unit';

/**
 * 伤害计算上下文
 * 包含伤害计算过程中的所有相关数据和状态
 */
export interface DamageContext {
  finalDamage: number;
  /** 攻击者单位 */
  attacker: BattleUnit;
  /** 防御者单位 */
  defender: BattleUnit;
  /** 是否为暴击 */
  isCritical: boolean;
  /** 使用的技能 */
  skill: BattleSkill;
}

/**
 * 战斗事件类型枚举
 * 定义了战斗中可能发生的各种事件类型
 */
export const BATTLE_EVENT_TYPE = {
  /** 战斗开始 */
  BATTLE_START: 'BATTLE_START',
  /** 回合开始 */
  ROUND_START: 'ROUND_START',
  /** 回合结束 */
  ROUND_END: 'ROUND_END',
  /** 单位行动开始 */
  UNIT_ACTION_START: 'UNIT_ACTION_START',
  /** 单位行动结束 */
  UNIT_ACTION_END: 'UNIT_ACTION_END',
  /** 攻击事件 */
  ATTACK: 'ATTACK',
  /** 伤害计算前 */
  BEFORE_DAMAGE_CALCULATION: 'BEFORE_DAMAGE_CALCULATION',
  /** 伤害事件 */
  DAMAGE: 'DAMAGE',
  /** 治疗事件 */
  HEAL: 'HEAL',
  /** 单位死亡 */
  UNIT_DEATH: 'UNIT_DEATH',
  /** 状态效果应用 */
  STATUS_APPLY: 'STATUS_APPLY',
  /** 状态效果移除 */
  STATUS_REMOVE: 'STATUS_REMOVE',
  /** 战斗结束 */
  BATTLE_END: 'BATTLE_END',
  /** 达到回合限制 */
  ROUND_LIMIT_REACHED: 'ROUND_LIMIT_REACHED',
  /** 日志更新 */
  LOG_UPDATE: 'LOG_UPDATE',
  /** 技能使用 */
  SKILL_USE: 'SKILL_USE',
} as const;

export type BattleEventType =
  (typeof BATTLE_EVENT_TYPE)[keyof typeof BATTLE_EVENT_TYPE];

/**
 * 战斗事件接口
 * 表示战斗中发生的各种事件，包含事件的详细信息和相关单位
 */
export interface BattleEvent {
  /**
   * 事件类型
   * @example 'ATTACK' - 攻击事件
   * @example 'DAMAGE' - 伤害事件
   * @example 'BATTLE_END' - 战斗结束事件
   */
  type: BattleEventType;
  /**
   * 事件发生的回合数
   * @optional 主要出现在回合相关事件中
   */
  round?: number;
  /**
   * 事件的来源单位
   * @optional 大多数事件都有相关单位
   */
  source?: BattleUnit;
  /**
   * 事件的目标单位
   * @optional 主要用于攻击、伤害等有目标的事件
   */
  target?: BattleUnit[];
  /**
   * 造成的伤害值
   * @optional 仅出现在伤害相关事件中
   */
  damage?: number;
  /**
   * 造成的治疗值
   * @optional 仅出现在治疗事件中
   */
  heal?: number;
  /**
   * 战斗胜利方
   * @optional 仅出现在战斗结束事件中
   */
  winner?: BattleSide;
  /**
   * 最大回合数限制
   * @optional 主要出现在回合限制事件中
   */
  maxRounds?: number;
  /**
   * 使用的技能
   * @optional 出现在攻击、伤害、治疗等与技能相关的事件中
   */
  skill?: BattleSkill;
}

export type BattleEventLogType = BattleEventType | 'MESSAGE';

export interface BattleEventLogItem {
  rarity: ItemRarity;
  name: string;
  quantity: number;
}

export interface BattleEventLog {
  type: BattleEventLogType;
  message: string;
  skill?: BattleSkill;
  items?: BattleEventLogItem[];
}

export interface BattleSettings {
  rarity: ItemRarity[];
}
